package com.example.auth.demo.config;

import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Swagger API文档配置类
 * 负责配置Swagger 2的文档生成器，定义API文档的基本信息和扫描范围
 * 通过访问/swagger-ui.html可以查看生成的API文档界面
 */
@EnableSwagger2
@Configuration
public class SwaggerConfig {

    // API联系人信息，用于文档展示
    private Contact contact = new Contact("Joetao","localhost:8080/swagger-ui.html", "cutesimba@163.com");

    /**
     * 创建REST API文档生成器
     * 配置Swagger扫描的API范围、排除的路径以及文档基本信息
     *
     * @return 配置好的Docket文档生成器
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                // 扫描所有控制器类的API
                .apis(RequestHandlerSelectors.any())
                // 排除错误处理路径，这些路径通常不包含业务API
                .paths(Predicates.not(PathSelectors.regex("/error.*")))
                .build()
                // 应用API基本信息
                .apiInfo(apiInfo());
    }

    /**
     * 构建API文档的基本信息
     * 包括标题、描述、版本、联系人等信息，展示在Swagger UI界面上
     *
     * @return API基本信息对象
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // API文档标题
                .title("平台接口 v1.0")
                // API文档描述
                .description("平台接口")
                // API联系人信息
                .contact(contact)
                // API版本号
                .version("1.0")
                .build();
    }
}